/**
 * Copyright (C), 2017-2018, 爱途科技
 * FileName: QuartzScheduler
 * Author:   Administrator
 * Date:     2018/3/28 13:08
 * Description: 定义JobDetail，Trigger
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.chorye.function.schedule.task;

import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

import static org.quartz.CronScheduleBuilder.cronSchedule;

/**
 * 该类用于启动项目时初始化立即执行的定时任务
 *
 * @author Chorye
 */
@Component
public class InitQuartzScheduler {

    /**
     * 日志工具
     */
    private final Logger log = LoggerFactory.getLogger(InitQuartzScheduler.class);
    /**
     * 定时任务调度器工厂
     */
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;

    /**
     * 创建bean时初始化任务
     *
     * @throws SchedulerException 定时任务异常
     */
    @PostConstruct
    public void init() {
//        scheduleJobs();
    }

    /**
     * 启动时初始化定时任务
     */
    private void scheduleJobs() {
        log.info("=======mission start========");
        // 从定时任务调度器工厂获取定时任务调度器
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        // 需要传递数据,就是使用JobDataMap
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("jobArg", "world");
        // 参数是需要执行定时任务的类名
        JobDetail jobDetail = JobBuilder.newJob(CheckStatusTask.class)
                // 指定自定义数据
                .setJobData(jobDataMap)
                // 设置任务描述
                .withDescription("CheckStatusTask")
                // 设置任务身份信息
                .withIdentity("initJobName", "initJobGroupName")
                // 构建
                .build();
        // 创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                // 指定要执行的任务
                .forJob(jobDetail)
                // 指定执行的定时任务表达式
                .withSchedule(cronSchedule("0 0/1 * * * ? "))
                // 构建
                .build();

        try {
            // 如果
            if (!scheduler.checkExists(JobKey.jobKey("initJobName", "initJobGroupName"))) {
                scheduler.scheduleJob(jobDetail, trigger);
            }
            // 启动任务
            scheduler.start();
            log.info("=======mission end========");
        } catch (SchedulerException e) {
            if (log.isErrorEnabled()) {
                log.error("初始化定时任务失败");
            }
        }
    }
}